骑士跳跃问题

骑士跳跃简单的说就是

在8*8的国际象棋上任意位置放一个骑士(马),给出一个终点,求起点到终点的最短路径


//
这题大部人都使用回溯法,个人认为完全没有必要,使用广度搜索是最快的,不过编程实现没有采用回溯的广度搜索,而是通过穷尽进行广度搜索 ,代码量可以降低很多

/代码如下
#include <stdio.h>
#include "memory.h"

unsigned char s[8][8],sx,sy,fx,fy;
unsigned char x[64],y[64];
int count =1;

/*
功能:得到下一步的所有可能位置
int cx :当前位置x轴坐标
int cy: 当前位置y轴坐标
int num:  当前步数
*/
int GetNext(int cx,int cy,int num)
{
int a,b;
/8个方位
a=cx-2;
b=cy-1;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

a=cx-1;
b=cy-2;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

a=cx+1;
b=cy-2;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

a=cx+2;
b=cy-1;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

a=cx+2;
b=cy+1;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

a=cx+1;
b=cy+2;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

a=cx-1;
b=cy+2;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

a=cx-2;
b=cy+1;
//判断该步在棋盘内且未走过
if( (a>=0)&&(a <8)&&(b>=0)&&(b <8)&&(s[a][b]==0) )
{
//记录步数
s[a][b]=num+1;

//记录下一位置
x[count]=a;
y[count]=b;
count++;

if((fx==a)&&(fy==b)) return 1;
}

return 0;
}

void main()
{
int i=0,step=1;
int cul=0,temp;

//起点 StartX  StartY
//在这里输入起点
sx=1;
sy=1;

//终点 FianlX FinalY
//在这里输入终点
fx=3;
fy=1;

//初始化表
memset(s,0,8*8);

//
x[cul]=sx;
y[cul]=sy;
s[sx][sy]=1;
cul=0;

//判断起点是否等于终点
if( (sx==fx)&&(sy==fy) ) return;

while(1)
{
for(temp=count;cul <temp;cul++)
{
if(GetNext(x[cul],y[cul],step) )
{
printf("step=%d/n",step);
return;
}
}
step++;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值